package link.wangkui.lamda;

/**
 *
 * @param <F>
 * @param <T>
 * 所谓函数式接口(Functional Interface)就是只包含一个抽象方法的声明。
 * 针对该接口类型的所有 Lambda 表达式都会与这个抽象方法匹配。
 * {另外，只是在接口上添加default并不算抽象方法}
 *
 * 总结：为了保证一个接口明确的被定义为一个函数式接口(Functional Interface)，
 * 我们需要为该接口添加注解：@FunctionalInterface。
 * 这样，一旦你添加了第二个抽象方法，编译器会立刻抛出错误提示。
 * ｛不填写，但是只写一个default也可以｝
 */
@FunctionalInterface
public interface IConverter<F, T> {

    T convert(F from);
   default void test() {
   }
    public static void main( String[] args ) {
        IConverter<String, Integer> converter01 = new IConverter<String, Integer>() {
            @Override
            public Integer convert(String from) {
                return Integer.valueOf(from);
            }
        };
        IConverter<String, Integer> converter02 = (from) -> {
            return Integer.valueOf(from);
        };
        IConverter<String, Integer> converter03 = from -> Integer.valueOf(from);
        //这四个点::的关键字，不只是可以引用方法和构造函数，还可以引用普通方法。
        IConverter<Integer, String> converter04 = String::valueOf;
        String converted04 = converter04.convert(11);
        System.out.println(converted04);
    }
}